from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible

#4.可以使用 django.utils.deconstruct.deconstructible类装饰器
@deconstructible
class MyStorage(Storage):

    def __init__(self, conf_path=None,ip=None):
        if conf_path is None:
            conf_path = settings.FDFS_CLIENT_CONF
        #给我们对象动态的添加属性
        self.conf_path = conf_path
        if ip is None:
            ip = settings.FDFS_URL
        self.ip = ip

    #打开文件的方法      应为我们获取图片的方法是通过http方式：http://192.168.152.128:8888/group1/M00/00/00/wKiYgFuGWZ-AMiv2AAJEQXRpOCE056.jpg
    #用不到open方法
    def _open(self, name, mode='rb'):
        pass

    #保存图片的方法
    def _save(self, name, content, max_length=None):
        #name： 只是上传图片的名字，不是路径
        #content：是上传图片的二进制

        #1.创建fastdfs客户端，需要设置 client.conf的路径
        client = Fdfs_client(self.conf_path)
        #2.获取图片的二进制内容
        data = content.read()
        #3.通过客户端上传二进制数据
        result = client.upload_by_buffer(data)
        #判断结果
        if result.get('Status') == 'Upload successed.':
            #直接将remote file_id 返回就可以，系统会自己处理
            return result.get('Remote file_id')
        else:
            raise Exception('上传失败')

    #exists  判断图片是否存在
    #应为fdfs已近做了图片不重名的处理，所以尽管上传，资源不会重复也不会覆盖
    def exists(self, name):
        return False

    #url 默认会将 name的值返回
    #我们获取资源时需要在name前边添加 tracker_ip(电脑id):8888
    #我们可以直接给它拼接
    def url(self, name):
        # return 'http://192.168.152.128:8888/' + name
        return self.ip + name